import {
  ButtonProps,
  CheckboxProps,
  FormItemProps,
  FormProps,
  Input,
  InputNumber,
  InputNumberProps,
  InputProps,
  RadioGroupProps,
  RadioProps,
  Select,
  TreeSelect,
  TreeSelectProps,
} from "ant-design-vue";
import { CascaderProps } from "ant-design-vue/es/vc-cascader";
import { SelectProps } from "ant-design-vue/es/vc-select";

export type PopupActionType = "create" | "edit" | "preview" | "copy";

export interface IFormPopupModel<TModel, TKey> {
  /**
   * 弹窗行为 新增 | 修改
   */
  action?: PopupActionType;

  /**
   * 编辑ID
   */
  id?: TKey;

  /**
   * 修改数据模型
   */
  data?: TModel;

  /**
   * 显示状态
   */
  visible: boolean;
}

/**
 * 组件字段
 */
export type ISerachFieldItem = {
  /**
   * 字段名
   */
  name: string;

  /**
   * 字段名[别名]
   */
  aliasName?: string;

  /**
   * 标题
   */
  label: string;

  /**
   * 组件名称
   */
  input: string;

  /**
   * 是否输入反馈
   */
  hasFeedback?: boolean;

  /**
   * 是否隐藏项
   */
  hide?: boolean;

  /**
   * 输入项是否独占一行
   */
  wholeLine?: boolean;

  /**
   * 过滤参数值显示格式化方法
   * @param value
   */
  formatter?(value: any): string;

  /**
   * 组件属性
   */
  props?: any;

  /**
   * 组件子节点
   */
  children?: Array<IComponentOptions>;

  /**
   * 事件监听处理
   */
  events?: Record<string, any>;
};

/**
 *
 */
export interface IComponentOptions {
  /**
   * 组件名称
   */
  name: string;
  /**
   * 组件属性
   */
  props?:
    | ButtonProps
    | InputProps
    | InputNumberProps
    | RadioProps
    | RadioGroupProps
    | CheckboxProps
    | SelectProps
    | TreeSelectProps
    | CascaderProps
    | FormProps
    | FormItemProps
    | any;

  /**
   * 组件内容（可选)
   */
  content?: string | Node;

  /**
   * 组件属性（HTML原生属性）
   */
  attrs?: any;

  /**
   * 组件事件监听
   */
  events?: {
    [key: string]: any;
  };

  children?: Array<IComponentOptions>;
}

/**
 * 按钮字段
 */
export type IButtonActionsItem = {
  /**
   * 按钮名称
   */
  title: string;

  /**
   * 按钮点击事件
   */
  click: Function | void;

  /**
   * 组件属性
   */
  props?: any;
};
